Manual:Creating interface tools/ru

Other languages:

В последних двух главах мы рассмотрели, как создать геометрию Детали - Part и создать параметрические объекты. Для получения полного контроля над FreeCAD не хватает последней детали: Создать инструменты, которые будут взаимодействовать с пользователем.

Во многих ситуациях не очень удобно создавать объект с нулевыми значениями, как мы делали с прямоугольником в предыдущей главе, а затем просить пользователя заполнить значения высоты и ширины на панели свойств. Это подходит для очень небольшого количества объектов, но станет очень утомительным, если вам нужно создать много прямоугольников. Лучшим способом будет возможность задавать высоту и ширину уже при создании прямоугольника.

Python предлагает базовый инструмент, позволяющий пользователю вводить текст на экране:

text = raw_input("Высота прямоугольника?")
print("Введённая высота равна ",text)

Однако для этого требуется запущенная консоль Python, а при запуске нашего кода из макроса мы не всегда уверены, что консоль Python будет включена на компьютере пользователя.

Графический интерфейс пользователя ГИП (рус.) GUI (англ.) - включающий в себя меню, панели инструментов, 3D-вид и другие визуальные компоненты FreeCAD - разработан для того, чтобы сделать программу интуитивно понятной и доступной. Он служит мостом между пользователем и основной функциональностью FreeCAD, позволяя как обычным пользователям, так и экспертам эффективно взаимодействовать с программой.

Графический интерфейс FreeCAD построен с использованием Qt, мощного набора инструментов графического интерфейса с открытым исходным кодом, который предоставляет широкий спектр возможностей. Qt предлагает основные строительные блоки для проектирования интерфейса, такие как диалоговые окна, кнопки, ярлыки, поля ввода текста и выпадающие меню, известные под общим названием "виджеты". Эти виджеты составляют основу пользовательского интерфейса FreeCAD.

Одним из ключевых преимуществ Qt является его кроссплатформенная совместимость, позволяющая FreeCAD без проблем работать на различных операционных системах, таких как Windows, macOS и Linux. Кроме того, гибкость Qt позволяет разработчикам легко расширять и настраивать интерфейс FreeCAD, создавая новые панели инструментов и меню или создавая совершенно новые модули, интегрируемые в программу. Благодаря такой адаптивности FreeCAD остаётся удобным для пользователя и легко расширяемым.

Для пользователей, заинтересованных в написании скриптов или разработке новых инструментов, Python API FreeCAD также предоставляет доступ ко многим функциям Qt. Это означает, что вы можете не только автоматизировать задачи, но и создавать пользовательские виджеты или диалоговые окна, которые интегрируются непосредственно в среду FreeCAD.

Инструменты Qt очень легко использовать из Python, благодаря модулю Python под названием PySide. PySide - это официальная привязка библиотеки Qt к Python, обеспечивающая удобный способ создания виджетов и взаимодействия с ними программным путём. Она позволяет разработчикам создавать интерфейсы, управлять пользовательским вводом (например, считывать текст из полей ввода) и определять действия, основанные на взаимодействии с пользователем, например, реагировать на нажатие кнопки. Используя PySide, вы можете создавать пользовательские диалоговые окна, меню и панели инструментов непосредственно в FreeCAD, расширяя его функциональность таким образом, чтобы она плавно интегрировалась с существующим интерфейсом.

PySide позволяет легко связать действия пользователя с конкретными функциями в вашем коде. Например, вы можете настроить кнопку так, чтобы при её нажатии запускался скрипт, выполняющий команду или изменяющий объект в 3D-виде. Эта интерактивная возможность открывает безграничные возможности для настройки рабочих процессов и автоматизации повторяющихся задач.

Qt также предоставляет ещё один интересный инструмент под названием Qt Designer, который сегодня встроен в более крупное приложение под названием Qt Creator. Он позволяет создавать диалоговые окна и панели интерфейса в графическом виде, вместо того чтобы писать код вручную. В этой главе мы будем использовать Qt Creator для разработки виджета панели, который мы будем использовать в панели Task - Задача FreeCAD. Итак, вам нужно скачать и установить Qt Creator с его официальной страницы, если вы работаете под Windows или Mac (под Linux он обычно доступен из приложения "Менеджер приложений").

В следующем упражнении мы сначала создадим панель с помощью Qt Creator, которая будет запрашивать значения длины, ширины и высоты, а затем создадим вокруг неё класс Python, который будет считывать значения, введённые пользователем с панели, и создавать куб с заданными размерами. Этот класс Python будет затем использоваться FreeCAD для отображения и управления панелью задач:

Начнём с создания виджета. Запусти Qt Creator, а затем выбери меню Файл → Создать файл или проект → Qt → Форма Qt Designer (затем нажать "Choose...") → Dialog without buttons. Нажми Далее (Next), укажи имя файла для сохранения, щёлкни Далее (Next), оставь все поля проекта в значениях по умолчанию ("<none>") и Создать (Create). Система задач FreeCAD автоматически добавляет кнопки OK/Отмена, поэтому здесь мы выбрали диалог без кнопок.

import FreeCAD,FreeCADGui,Part
 
# CHANGE THE LINE BELOW
path_to_ui = "C:\Users\yorik\Documents\dialog.ui"
 
class BoxTaskPanel:
   def __init__(self):
       # this will create a Qt widget from our ui file
       self.form = FreeCADGui.PySideUic.loadUi(path_to_ui)
 
   def accept(self):
       length = self.form.BoxLength.value()
       width = self.form.BoxWidth.value()
       height = self.form.BoxHeight.value()
       if (length == 0) or (width == 0) or (height == 0):
           print("Error! None of the values can be 0!")
           # we bail out without doing anything
           return
       box = Part.makeBox(length,width,height)
       Part.show(box)
       FreeCADGui.Control.closeDialog()
        
panel = BoxTaskPanel()
FreeCADGui.Control.showDialog(panel)

В приведённом выше коде мы использовали удобную функцию „“'PySideUic.loadUi'„“ из модуля FreeCADGui. Эта функция загружает файл .ui, создаёт из него виджет Qt и сопоставляет имена, чтобы мы могли легко получить доступ к подвиджетам по их именам (например: self.form.BoxLength)

Функция "accept - принять" также является удобством, предлагаемым Qt. Если в диалоге есть кнопка "OK" (что происходит по умолчанию при использовании панели задач FreeCAD), любая функция с именем "accept - принять" будет автоматически выполняться при нажатии кнопки "OK". Аналогично можно добавить функцию "reject - отклонить", которая будет выполняться при нажатии кнопки "Отмена". В нашем случае мы не добавили эту функцию, поэтому нажатие кнопки "Отмена" приведёт к поведению по умолчанию (ничего не делать и закрыть диалог).

Если мы реализуем любую из функций accept или reject (принять или отклонить), их поведение по умолчанию (ничего не делать и закрыть) больше не будет выполняться. Поэтому нам нужно самим закрыть панель задач. Это делается с помощью:

FreeCADGui.Control.closeDialog()

После того как мы получили нашу панель BoxTaskPanel, которая имеет 1-е виджет под названием «self.form» и 2-е, если необходимо, функции принятия и отклонения, мы можем открыть панель задач с её помощью, что и делается с помощью этих двух последних строк:

panel = BoxTaskPanel()
 FreeCADGui.Control.showDialog(panel)

Обратите внимание, что виджет, созданный с помощью PySideUic.loadUi, не является специфическим для FreeCAD, это стандартный виджет Qt, который можно использовать с другими инструментами Qt. Например, мы могли бы показать с его помощью отдельное диалоговое окно. Попробуйте сделать это в Python-консоли FreeCAD (конечно, используя правильный путь к вашему .ui файлу):

from PySide import QtGui
 w = FreeCADGui.PySideUic.loadUi("C:\Users\yorik\Documents\dialog.ui")
 w.show()

Конечно, мы не стали добавлять в диалог кнопки "ОК" или "Отмена", поскольку он был создан для использования из панели задач FreeCAD, где уже есть такие кнопки. Поэтому нет никакого способа закрыть диалог (кроме нажатия кнопки "Закрыть окно"). Но функция show() создаёт немодальный диалог, то есть не блокирует остальную часть интерфейса. Поэтому, пока наш диалог открыт, мы можем читать значения полей:

w.BoxHeight.value()

Это очень полезно для тестирования.

Наконец, не забудьте, что на FreeCAD Wiki, в разделе Написание сценариев Python, есть много другой документации по использованию виджетов Qt, которая содержит Руководство по созданию диалогов, специальный учебник по PySide из 3-х частей, который подробно освещает эту тему.

Связанные ссылки